// cf-14e
// 题意：给定n(3<=n<=20)个坐标(xi, yi), xi = i 且 1<=yi<=4。
//       现在已知t，要使得：
//         1.恰好有t个峰即t个点 yj-1 < yj > yj+1, 2<=j<=n-1
//         2.恰好有t-1个谷即t-1个点满足 yj-1 > yj < yj+1, 2<=j<=n-1
//         3.没有相邻点y相同。
//       问有多少种方案。
//
// 题解：很直观的dp, 设f[i][j][k][l][d]表示前i个点，有j个峰，k个谷，
//       当前最后一位是l，目前的方向是d(想上或下)有多少种方案。
//       因为n>=3，所以初始化的时候枚举前两个数就行。
//
// run: $exec < input
#include <iostream>

int const maxn = 27;
int const maxt = 17;
int f[maxn][maxt][maxt][5][2]; // stand for n, t camels and t - 1 camels and last number, and direction
int n, t;

int main()
{
	std::cin >> n >> t;
	for (int i = 1; i <= 4; i++)
		for (int j = 1; j <= 4; j++) {
			if (i == j) continue;
			f[2][0][0][j][j > i]++;
		}
	for (int i = 3; i <= n; i++) {
		for (int j = 0; j <= t; j++) {
			for (int k = 0; k <= j; k++) {
				for (int l = 1; l <= 4; l++) {
					// 0 down
					for (int pl = l + 1; pl <= 4; pl++) {
						f[i][j][k][l][0] += f[i - 1][j][k][pl][0];
						if (!j) continue;
						f[i][j][k][l][0] += f[i - 1][j - 1][k][pl][1];
					}

					// 1 up
					for (int pl = 1; pl < l; pl++) {
						f[i][j][k][l][1] += f[i - 1][j][k][pl][1];
						if (!k) continue;
						f[i][j][k][l][1] += f[i - 1][j][k - 1][pl][0];
					}
					/*
					std::cout << "f[" << i << "][" << j << "][" << k << "][" << l << "][0] = " << f[i][j][k][l][0] << '\n';
					std::cout << "f[" << i << "][" << j << "][" << k << "][" << l << "][1] = " << f[i][j][k][l][1] << '\n';
					*/
				}
			}
		}
	}
	int ans = 0;
	for (int i = 1; i <= 4; i++)
		ans += f[n][t][t - 1][i][0];
	std::cout << ans << '\n';
}

